import threading
import queue
import time
from utils.mail import Email

#消息先收集起来，30秒内的合到一个邮件里面发送
class QueueProcessor:
    def __init__(self):
        self.queue = queue.Queue()
        self.timer = None


    def schedule_processing(self):
        """ 安排或重置定时器，30秒无新消息后触发处理 """
        # 取消之前的定时器（如果存在）
        if self.timer is not None:
            self.timer.cancel()
        # 创建新定时器，30秒后执行处理函数
        self.timer = threading.Timer(30.0, self.process_queue)
        self.timer.start()

    def process_queue(self):
        """ 处理队列中的所有消息 """
        data = []
        while True:
            try:
                item = self.queue.get_nowait()  # 非阻塞获取数据
                data.append(item)
            except queue.Empty:
                break  # 队列已空，结束循环

        if data:
            print(f"[处理器] 已处理 {len(data)} 条数据: {data}")
            info = ''.join(data)
            self.sendMail(f' You have received {len(data)} new messages',info)
        else:
            print("[处理器] 没有数据需要处理")

    def put_item(self, item):
        """ 生产者调用此方法添加数据 """
        self.queue.put(item)
        self.schedule_processing()  # 每次添加数据时重置定时器

    def sendMail(self, subject, info):
        try:
            email = Email()
            email.set_subject(subject)
            email.set_message(info)
            email.send()
        except Exception as e:
            print(f"[邮件] 发送失败: {e}")

def main():
    # 创建 QueueProcessor 实例
    processor = QueueProcessor()
    print(f'time1={time.time()}')
    # 向队列添加一些数据
    processor.put_item("消息 1")
    processor.put_item("消息 2")
    processor.put_item("消息 3")

    # 模拟一些等待时间，给定时器和线程时间来处理队列
    time.sleep(10)  # 等待 10 秒，确保数据已处理

    # 向队列添加更多数据
    processor.put_item("消息 4")

    # 模拟更多等待时间，给定时器和线程时间来处理队列
    time.sleep(20)  # 等待 20 秒，确保定时器处理数据
    processor.put_item("消息 5")
    # 主程序继续执行，队列处理正在后台进行...
    print("主程序继续执行，队列处理正在后台进行...")

if __name__ == "__main__":
    main()
    time.sleep(66)